package com.luxsoft.siipap.em.replica.importadores.ventas;

import java.util.HashSet;
import java.util.Set;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Predicate;

import com.luxsoft.siipap.cxc.model.OrigenDeOperacion;
import com.luxsoft.siipap.em.replica.importadores.ImportadorSupport;
import com.luxsoft.siipap.em.replica.model.Registro;
import com.luxsoft.siipap.em.replica.online.RegistroMapper;
import com.luxsoft.siipap.model.Sucursal;
import com.luxsoft.siipap.model.core.Cliente;
import com.luxsoft.siipap.service.ServiceLocator2;
import com.luxsoft.siipap.ventas.model.Venta;
import com.luxsoft.siipap.ventas.model.VentaCredito;

public class VentaRegistroMapper implements RegistroMapper<Venta>{

	public Venta mapRegistro(Registro r) throws RuntimeException {
		String prefix=null;
		String origen=null;
		if(r.getArchivo().startsWith("MOCOCA")){
			prefix="MCA";
			origen="CAM";
		}
		else if(r.getArchivo().startsWith("MOCOMO")){
			prefix="MCM";
			origen="MOS";
		}
		else if(r.getArchivo().startsWith("MOVCRE")){
			prefix="MCR";
			origen="CRE";
		}
		Number sucursal=r.getNumber(prefix+"SUCURSA");		
		String serie=r.getString(prefix+"SERIEFA");
		String tipo=r.getString(prefix+"TIPOFAC");
		Number numero=r.getNumber(prefix+"NUMDOCT");
		String clave=r.getString(prefix+"CLAVCLI");
		
		OrigenDeOperacion op=OrigenDeOperacion.valueOf(origen);
		Venta v=new Venta();
		v.setOrigen(op);		
		v.setSucursal(buscarSucursal(sucursal.intValue()));
		Cliente c=ServiceLocator2.getClienteManager().buscarPorClave(clave);
		if(c==null){
			c=new Cliente(clave,r.getString(prefix+"nombcli"));
		}
		v.setCliente(c);
		v.setTipoSiipap(tipo);
		v.setSerieSiipap(serie);
		v.setFecha(r.getDate(prefix+"FECHA"));
		v.setImpuesto(r.getBigDecimal(prefix+"IMPUEST"));
		v.setImporte(r.getBigDecimal(prefix+"SUBTOT"));
		v.setTotal(r.getBigDecimal(prefix+"TOTAL"));
		v.setCobrador(ImportadorSupport.getInstance().buscarCobrador(r.getNumber(prefix+"COBRADO").intValue()));
		if("CRE".equals(origen)){
			VentaCredito credito=new VentaCredito();
			v.setCredito(credito);
			v.setVendedor(ImportadorSupport.getInstance().buscarVendedor(r.getNumber(prefix+"VENDEDO").intValue()));
		}
		if(v.getTipoSiipap().equals("G"))
			v.setPostFechado(true);
		v.setDocumento(numero.longValue());
		v.setPrecioBruto(false);
		v.setComentario(r.getString(prefix+"COMFAC"));
		return v;
	}
	
	private Set<Sucursal> sucursales=new HashSet<Sucursal>();
	
	public  Sucursal buscarSucursal(final int clave){
		if(sucursales.isEmpty()){
			sucursales.addAll(ServiceLocator2.getLookupManager().getSucursales());
		}
		return (Sucursal) CollectionUtils.find(sucursales, new Predicate(){
			public boolean evaluate(Object input) {
				Sucursal p=(Sucursal)input;
				return p.getClave()==clave;
			}
		});
	}

}
